//
// Created by twlin on 2024/8/3.
//
//#include <stdio.h>
//#include <stdlib.h>
//#include <unistd.h>
//#include <sys/socket.h>
//#include <sys/types.h>
//#include <sys/epoll.h>
//#include <string.h>
//#include <errno.h>
//#include <netinet/in.h>
//#include <arpa/inet.h>
//#include <fcntl.h>
#include <csignal>
#include "ctcpserver.h"


#define MAX_LISTEN_QUE 5

#define SERV_PORT 8888

#define MAX_BUFFER_SIZE 100

#define MAX_EVENTS 500

//#define RT_ERR (-1)
//#define RT_OK 0


// 自定义信号处理函数
void sigint_handler(int sig) {
    printf("Caught signal %d, exiting gracefully...\n", sig);
    // 这里可以添加更多的清理工作
    // 例如：关闭文件、数据库连接等
//    exit(EXIT_SUCCESS);
//    bRunning = false;
    CTcpServer::getInstance()->stopEpoll();
}

//int mz_ipv4_tcp_create_socket(void)
//{
//    int opt = 1;
//    int ret, len;
//    socket_t listenfd;
//    struct sockaddr_in server;
//
//    if((listenfd = CSocket::create(AF_INET, SOCK_STREAM, 0)) < 0)
//    {
//        perror("socket error");
//        return -1;
//    }
//
//    //设置地址为可重用
//    if(ret = CSocket::setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0)
//    {
//        perror("Create socket fail");
//        return -1;
//    }
//
//    bzero(&server, sizeof(server));
//    server.sin_family = AF_INET;
//    server.sin_addr.s_addr = htonl(INADDR_ANY);
//    server.sin_port = htons(SERV_PORT);
//
//    len = sizeof(struct sockaddr_in);
//    if(CSocket::bind(listenfd, (struct sockaddr *)&server, len) < 0)
//    {
//        perror("connect error");
//        close(listenfd);
//        return -1;
//    }
//
//    CSocket::listen(listenfd, MAX_LISTEN_QUE);
//
//    return listenfd;
//}
//
//int mz_process_data(int sockfd)
//{
//    int bytes;
//    char buf[MAX_BUFFER_SIZE];
//    char *s = buf;
//    char flag = 1;
//    int len = 0;
//
//
//    bzero(buf, MAX_BUFFER_SIZE);
//    while(flag)
//    {
//        bytes = CSocket::recv(sockfd, s, 5, 0);
//        if(bytes < 0)
//        {
//            if(errno == EAGAIN)
//            {
//                printf("no data.\n");
//                break;
//            }
//            perror("recv err:");
//            return -1;
//        }
//        if(bytes == 0)
//        {
//            if(errno != EWOULDBLOCK || errno != EAGAIN)
//            {
//                return -2;
//            }
//        }
//        if(bytes == 5 && s[bytes-1] != '\n')
//            flag = 1;
//        else
//            flag = 0;
//
//        s += bytes;
//        len += bytes;
//        printf("bytes: %d\n", bytes);
//    }
//
//    printf("buf: %s\n", buf);
//    CSocket::send(sockfd, buf, len, 0);
//    return 0;
//}

int main(int argc, char *argv[])
{
    signal(SIGINT, sigint_handler);

    CTcpServer::getInstance()->startEpoll();

    CTcpServer::deleteInstance();

//    int i;
//    socket_t listenfd, sockfd;
//    int epollfd, fds;
//    socklen_t len;
//    struct epoll_event ev, events[MAX_EVENTS];
//    struct sockaddr_in client;
//
//    signal(SIGINT, sigint_handler);
//
//    len = sizeof(struct sockaddr_in);
//    epollfd = epoll_create(MAX_EVENTS);
//    if(epollfd < 0)
//    {
//        perror("epoll_create err:");
//        return -1;
//    }
//
//    listenfd = mz_ipv4_tcp_create_socket();
//
//    fcntl(listenfd, F_SETFL, O_NONBLOCK);
//
//    ev.data.fd = listenfd;
//    ev.events = EPOLLIN;
//    if(epoll_ctl(epollfd, EPOLL_CTL_ADD, listenfd, &ev) < 0)
//    {
//        perror("epoll_ctl err:");
//        return -1;
//    }
//
//    while(bRunning)
//    {
//        fds = epoll_wait(epollfd, events, MAX_EVENTS, -1);
//        if(fds < 0)
//        {
//            if (errno == EINTR) {
//                continue; // 被信号中断，重新尝试
//            } else {
//                perror("epoll_wait err:");
//                return -1;
//            }
//        }
//
//        for(i = 0; i < fds; i++)
//        {
//            if(events[i].data.fd == listenfd)
//            {
//                if((sockfd = CSocket::accept(listenfd, (struct sockaddr *)&client, &len)) < 0)
//                {
//                    perror("accept error.\n");
//                    continue;
//                }
//                ev.data.fd = sockfd;
//                ev.events = EPOLLIN | EPOLLET;
//                epoll_ctl(epollfd, EPOLL_CTL_ADD, sockfd, &ev);
//                continue;
//            }
//            else
//            {
//                if(mz_process_data(events[i].data.fd) == -2)
//                {
//                    CSocket::close(events[i].data.fd);
//                    epoll_ctl(epollfd, EPOLL_CTL_DEL, events[i].data.fd, &ev);
//                    continue;
//                }
//            }
//        }
//    }
//    CSocket::close(listenfd);
//    close(epollfd);

    return 0;
}